home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / STRINGS.SWG / 0104_Super FAST upcase.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  5KB  |  116 lines

  1.  
  2. {
  3.   To SWAG (group STRINGS.SWG)
  4.  
  5.   Jose Campione claimed that he had the fastest upperstring, 
  6.   I proved otherwise. Look at the difference in speed
  7.   between TXLat5 of Jose Campione and mine.
  8.  
  9.    The following benchmarking was done in a 486/DX 60 MHz using
  10.    Neil Rubenking's TimeTick unit while upcasing a full string
  11.    (255 chars) 400,000 times (100 million characters):
  12.  
  13.    For-Do loop using TP7 UpCase() .......... 315.5 secs.
  14.    UpperCase (Assembler classical approach)   53.9 secs. (1)
  15.    My old TXlat3 ...........................  28.3 secs. (2)
  16.    Translate ...............................  26.8 secs. (3)
  17.    TXlat5 ..................................  21.2 secs.
  18.  
  19.    SUPERFASTUPSTRING .......................  17.1 secs. (!)
  20.  
  21.    Oscar N. Verzaal (bkverzaa@sus.edu.eur.nl)
  22.  
  23. }
  24.  
  25. Program UpString;
  26.  
  27. uses Crt, Dos;
  28.  
  29. type
  30.   ByteArray        = array[0..255] of byte;
  31.  
  32. var
  33.   Source1,
  34.   Source           : string;
  35.   Table            : ByteArray;
  36.   k, nr            : longint;
  37.   u, m, s, s100    : word;
  38.   tm1, tm2, t1, t2 : real;
  39.  
  40.     Procedure TXlat5(var Source: string; var Table: ByteArray);assembler;
  41.     asm
  42.         mov  dx, ds       { save ds }
  43.         lds  bx,Table     { load ds:bx with Table address }
  44.         les  di,Source    { load es:di with Source address }
  45.         seges             { override ds segment}
  46.         mov  al,[di]      { load al with length of source }
  47.         xor  ah, ah       { set ah to zero, we need a word for cx }
  48.         mov  cx,ax         { assign length of source to counter }
  49.         jcxz @end         { if cx = 0 exit}
  50.         inc  di           { increment di & skip length byte on 1st pass }
  51.       @filter:
  52.         mov  al,[di]      { load byte in ax from es:di }
  53.         xlat              { tan-xlat-e... }
  54.         mov  [di],al      { send byte to es:di }
  55.         inc  di           { increment di }
  56.         loop @filter      { decrement cx and loop back if cx > 0 }
  57.       @end: mov  ds, dx   { restore ds }
  58.     end;
  59.  
  60.     Procedure SuperFastUpString(var Source, Table);
  61.       inline($8C/$DA/           { mov   dx, ds                  }
  62.              $5B/               { pop   bx   | lds bx, Table    }
  63.              $1F/               { pop   ds   |                  }
  64.              $5F/               { pop   di   | les di, Source   }
  65.              $07/               { pop   es   |                  }
  66.              $8A/$0D/           { mov   cl, [di]                }
  67.              $08/$C9/           { or    cl, cl                  }
  68.              $74/$0F/           { jz    @end                    }
  69.              $30/$ED/           { xor   ch, ch                  }
  70.              $47/               { inc   di                      }
  71.                                 { @loop:                        }
  72.              $8A/$05/           { mov   al, [di]                }
  73.              $D7/               { xlat                          }
  74.              $88/$05/           { mov   [di], al                }
  75.              $47/               { inc   di                      }
  76.              $49/               { dec   cx                      }
  77.              $75/$F7/           { jnz   @loop                   }
  78.                                 { @end:                         }
  79.              $8E/$DA);          { mov   ds, dx                  }
  80.  
  81. begin
  82.   ClrScr;
  83.   nr:=400000;
  84.   writeln('Number of times ',nr:6);
  85.   writeln('----------------------');
  86.  
  87.   for k:= 0 to 255 do
  88.     if k in [$61..$7A] then Table[k]:= k - $20 else Table[k]:= k;
  89.  
  90.   Source1:= 'this string is to be upcased this string is to be upcased this string is to be upcased '+
  91.             'this string is to be upcased this string is to be upcased this string is to be upcased '+
  92.             'this string is to be upcased this string is to be upcased this string is to be u.';
  93.  
  94.   Source := Source1;
  95.   GetTime(u, m, s, s100);
  96.   t1 := (u*3600) + (m*60) + s + (s100/100);
  97.   for k:=1 to nr do TXLat5(Source, Table);
  98.   GetTime(u, m, s, s100);
  99.   t2 := (u*3600) + (m*60) + s + (s100/100);
  100.   tm1 := t2 - t1;
  101.   writeln('TXLat5            took ',tm1:5:2,'sec');
  102.  
  103.   Source := Source1;
  104.   GetTime(u, m, s, s100);
  105.   t1 := (u*3600) + (m*60) + s + (s100/100);
  106.   for k:=1 to nr do SuperFastUpString(Source, Table);
  107.   GetTime(u, m, s, s100);
  108.   t2 := (u*3600) + (m*60) + s + (s100/100);
  109.   tm2 := t2 - t1;
  110.   writeln('SuperFastUpString took ',tm2:5:2,'sec');
  111.  
  112.   writeln;
  113.   writeln('Speed advantage of SuperFastUpString over TXlat5 is ',100*((tm1 - tm2) / tm1):6:2,'%');
  114.  
  115. end.
  116.